package com.quectel.core.module.device.service.mongo;

import com.quectel.core.module.device.dto.DeviceCurrentAlarmDto;
import com.quectel.core.module.device.dto.mongo.MongoDeviceAlarmLogDto;
import com.quectel.core.module.device.dto.mongo.MongoDeviceCommandLogDto;
import com.quectel.core.module.device.dto.mongo.MongoDeviceDataLogDto;

import java.util.List;
import java.util.Map;

/**
 * 设备服务
 *
 * @author caolu
 * @email louis.cao@quectel.com
 */
public interface MongoDeviceService {

    /**
     * 查询指令日志总数
     *
     * @param params
     * @return
     */
    int queryDeviceCommandLogTotal(Map<String, Object> params);

    /**
     * 查询指令日志
     *
     * @param params
     * @return
     */
    List<MongoDeviceCommandLogDto> queryDeviceCommandLog(Map<String, Object> params);

    /**
     * 保存指令日志
     *
     * @param mongoDeviceCommandLogDto
     */
    Long saveCommandData(MongoDeviceCommandLogDto mongoDeviceCommandLogDto);


    /**
     * 查询告警日志总数
     *
     * @param searchMap 搜索条件
     * @param field     聚合字段 $deviceEntity.deviceTypeId 或者 deviceEntity.deviceTypeId $可选
     * @return 需要注意key可能为 null
     */
    Map<String, Integer> groupDeviceAlarmLogCount(Map<String, Object> searchMap, String field);

    /**
     * 查询告警日志总数
     *
     * @param params
     * @return
     */
    int queryDeviceAlarmLogTotal(Map<String, Object> params);

    /**
     * 查询告警日志
     *
     * @param params
     * @return
     */
    List<MongoDeviceAlarmLogDto> queryDeviceAlarmLog(Map<String, Object> params);

    /**
     * 查询上报数据总数
     *
     * @param params
     * @return
     */
    int queryReportDataTotal(Map<String, Object> params);

    /**
     * 查询上报数据
     *
     * @param params
     * @return
     */
    List<MongoDeviceDataLogDto> queryReportData(Map<String, Object> params);

    /**
     * 保存上报的数据
     *
     * @param mongoDeviceDataLogDto
     */
    void saveReportData(MongoDeviceDataLogDto mongoDeviceDataLogDto);

    /**
     * 存入告警日志
     *
     * @param mongoDeviceAlarmLogDto
     */
    void saveDeviceAlarmLog(MongoDeviceAlarmLogDto mongoDeviceAlarmLogDto);

    /**
     * 告警日志恢复
     *
     * @param deviceCurrentAlarmDto
     */
    void recoveryAlarmLog(DeviceCurrentAlarmDto deviceCurrentAlarmDto, Byte handMethod);


}
